package Personajes;

import Objetos.*;
import Mundo.*;
import java.io.IOException;
import java.util.*;
import Interfaz.*;
import javax.swing.JOptionPane;
import Grafico.Ventana_principal;
import java.io.Serializable;
import IA.*;

public class Ejercito implements Serializable {

    private int tipo_ejercito;
    private int cant_batallones;
    private ArrayList<Batallon> batallones = new ArrayList();
    private transient QuickIA hilo;
    public int dinero_total;

    public void set_hilo(QuickIA hilo) {

        this.hilo = hilo;

    }

    public int getDinero_total() {
        return this.dinero_total;
    }

    public Ejercito(int tipo_ejercito) {
        this.tipo_ejercito = tipo_ejercito;
        this.cant_batallones = 0;
        this.dinero_total = 0;

    }

    public Ejercito() {
        this.tipo_ejercito = 0;
//0 patriotas, 1 realistas
        this.cant_batallones = 0;

    }

    public void cura(Ventana_principal v) {
        for (int i = 0; i < this.cant_batallones; i++) {
            int x = this.batallones.get(i).cure();
            if (x > 0) {
                v.imprime("Batallon " + i + " ha recobrado " + x + " salud gracias a las rabonas!!");
            }
        }
    }

    public ArrayList<Batallon> getBatallones() {
        return batallones;
    }

    public int buscBatallon(int x, int y) {
        Batallon bat = null;

        for (int i = 0; i < getCant_batallones(); i++) {
            bat = getBatallones().get(i);
            if (bat.getX() == x && bat.getY() == y) {
                return i;
            }
        }
        return -1;
    }

    public void setBatallones(ArrayList<Batallon> batallones) {
        this.batallones = batallones;
    }

    public void convencer(Batallon batallon_propio, Batallon batallon_a_convencer, Mapa map, Ventana_principal v) {
        double factorPropio, factorOtro;
        factorPropio = batallon_propio.getAtkTot() - (0.8) * batallon_a_convencer.getDefTot();
        factorOtro = batallon_a_convencer.getAtkTot() - (0.8) * batallon_propio.getDefTot();
        if (batallon_propio.getTieneHeroe()) {
            factorPropio += factorOtro;
        }
        if (factorOtro <= 0 || (factorPropio / factorOtro) > 1.0) {
            batallon_a_convencer.setBando(0, map);
            batallon_a_convencer.setSprite(map);
            this.agregar_batallon(batallon_a_convencer);
            int tipo = batallon_a_convencer.getPersonajes()[0].tipo;
            if (tipo == 1 || tipo == 3 || tipo == 4) {
                v.imprime("¡Pelearemos por nuestra libertad!");
            } else {
                v.imprime("Nos uniremos a tu ejercito, ¡A por la victoria!");
            }
        } else {
            int tipo = batallon_a_convencer.getPersonajes()[0].tipo;
            if (tipo == 1 || tipo == 3 || tipo == 4) {
                v.imprime("¡No moriremos en una guerra sin sentido!");

            } else {
                v.imprime("No sois suficientemente fuertes para consideraros como nuestros camaradas, ¡Perdíos!");
            }
        }
    }

    public int getCant_batallones() {
        return cant_batallones;
    }

    public void setCant_batallones(int cant_batallones) {
        this.cant_batallones = cant_batallones;
    }

    public int getTipo_ejercito() {
        return tipo_ejercito;
    }

    public void setTipo_ejercito(int tipo_ejercito) {
        this.tipo_ejercito = tipo_ejercito;
    }

    public void agregar_batallon(Batallon batallon) {
        this.batallones.add(batallon);
        this.cant_batallones++;
    }

//    public int imprimeArma(ArrayList<Integer> v_armas, ArrayList<Integer> v_armaduras/*, int[] cantidades*/) {
//        int[] cont = new int[9];
//        Scanner sc = new Scanner(System.in);
//        for (int i = 0; i < 6; i++) {
//            cont[i] = 0;
//        }
//        for (int i = 0; i < 6; i++) {
//            int cant_armas = v_armas.size();
//            for (int j = 0; j < cant_armas; j++) {
//                if (v_armas.get(j) == i) {
//                    cont[i]++;
//                }
//            }
//        }
//        for (int i = 6; i < 9; i++) {
//            int cant_armaduras = v_armaduras.size();
//            for (int j = 0; j < cant_armaduras; j++) {
//                if (v_armaduras.get(j) == i) {
//                    cont[i]++;
//                }
//            }
//        }
//        if (cont[0] + cont[1] + cont[2] + cont[3] + cont[4] + cont[5] + cont[6] + cont[7] + cont[8] != 0) {
//            System.out.println("Ha encontrado estas armas y armaduras:");
//        }
//
//        for (int i = 0; i < 9; i++) {
//            if (cont[i] != 0) {
//                System.out.println(Armeria.getArma(i).getNombre() + ": " + cont[i]);
//            }
//        }
//        if (cont[0] + cont[1] + cont[2] + cont[3] + cont[4] + cont[5] != 0) {
//            System.out.println("¿Desea recoger armas ofensivas o defensivas?");
//            System.out.println("1. Ofensivas");
//            System.out.println("2. Defensivas");
//        }
//        return sc.nextInt();
//    }
    public ArrayList<ArrayList<Integer>> ataca(Batallon batallon_propio, Batallon enemigo) {
        double danho = (batallon_propio.getAtkTot() - (0.3) * enemigo.getDefTot()) * (1.1 * (batallon_propio.getNumPersonajes() / enemigo.getNumPersonajes()));
        int num_armas = 0;
        Scanner sc = new Scanner(System.in);
        ArrayList<Integer> v_armas = new ArrayList();
        ArrayList<Integer> v_armaduras = new ArrayList();
        ArrayList<ArrayList<Integer>> recogido = null;
        //int cant_armas=0,cant_armaduras=0;
//        int[] cantidades = new int[2];
        
        //sonido al atacar yay!
        String nombSonido = "";
        double rand = Math.random() * 10;
        if (rand >= 5) {
            nombSonido = "metal_interaction1.wav";
        } else {
            nombSonido = "metal_interaction2.wav";
        }
        Sonido son = new Sonido(nombSonido);
        son.setDaemon(true);
        son.start();
        //fin sonido
        
        enemigo.recibir_danho(danho, v_armas, v_armaduras/*, cantidades*/);

        //en los vectores se tienen las armas y armaduras recojidas        
        if (batallon_propio.getBando() == 0 && v_armas.size() > 0 && v_armaduras.size() > 0) {
            //int opc = imprimeArma(v_armas, v_armaduras/*, cantidades*/);
            this.hilo.detente();
            //Object opciones[] = {"Ofensivas", "Defensivas"};
            //int opc = JOptionPane.showOptionDialog(null, "Desea recoger las armas ofensivas o defensivas?", "Escoja una opcion", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null, opciones, null);
            //parametros de showOptionDialog
            //1. De que elemento depende, en este caso de ninguno
            //2. que pregunta realizara
            //3. el titulo del popup
            //4. tipo de aviso, en este caso si o no (1 o 0 respectivamente)
            //5. que tipo de popup sera.. de advertencia, de pregunta etc
            //6. que icono tendra el popup en este caso ninguno y se queda con el icono por defecto
            //7. las opciones que saldran
            //8. el valor inicial¿? no se que es esto asi que le puse null XD
            recogido = new ArrayList<ArrayList<Integer>>();
            recogido.add(v_armas);
            recogido.add(v_armaduras);
            //dinero_total += batallon_propio.recoger_arma(v_armas, v_armaduras/*, cantidades[0], cantidades[1]*/, opc);
            this.hilo.sigue();
        }
        return recogido;
        //verifica_batallones(map)
    }

    public void verifica_batallones(Mapa map) {
        //Si ya no hay unidades desactivar el batallon
        int x = cant_batallones;
        for (int i = 0; i < x; i++) {
            if (batallones.get(i).getNumPersonajes() == 0) {
                batallones.get(i).setMuerto(true, map);
                //cant_batallones--;
            }
        }
    }

    public int busca_bat(String nombre) {
        for (int i = 0; i < this.cant_batallones; i++) {
            if (this.batallones.get(i).getNombre().equals(nombre)) {
                return i;
            }

        }
        return -1;
    }

    public Batallon getBatallonActivo() {
        for (int i = 0; i < this.cant_batallones; i++) {
            if (this.batallones.get(i).getActivo()) {
                return this.batallones.get(i);
            }
        }
        return null; //no encontro ningun batallon activo
    }

    public void merge(Batallon bat1, Batallon bat2, Mapa map) {
        int x = 1;
        while (x != 0) {
            Personaje soldado = bat2.sacarPersonaje(0);
            if ((x = bat1.agregarPersonaje(soldado)) == 0) {
                bat2.agregarPersonaje(soldado);
            }
            x *= bat2.getNumPersonajes();
        }
        bat1.setSprite(map);
        if (bat2.getNumPersonajes() == 0) {
            bat2.setMuerto(true, map);
        }
    }

    public void reclutarAldeanos(Batallon bat, Aldea ald, Mapa map, Ventana_principal v) {
        Batallon b = new Batallon(ald.getAldeanos());

        double factorPropio, factorOtro;
        factorPropio = bat.getAtkTot() - (0.8) * b.getDefTot();
        factorOtro = b.getAtkTot() - (0.8) * bat.getDefTot();
        if (bat.getTieneHeroe()) {
            factorPropio += factorOtro;
        }
        if (factorOtro <= 0 || (factorPropio / factorOtro) > 1.0) {
            int tipo = b.getPersonajes()[0].tipo;
            if (tipo == 1 || tipo == 3 || tipo == 4) {
                v.imprime("¡Pelearemos por nuestra libertad!");
            } else {
                v.imprime("Nos uniremos a tu ejercito, ¡A por la victoria!");
            }
            this.merge(bat, b, map);
            ald.getAldeanos().clear();
        } else {
            int tipo = b.getPersonajes()[0].tipo;
            if (tipo == 1 || tipo == 3 || tipo == 4) {
                v.imprime("¡No moriremos en una guerra sin sentido!");
            } else {
                v.imprime("No sois suficientemente fuertes para consideraros como nuestros camaradas, ¡Perdíos!");
            }
        }
    }

    public void comprarArmas(Batallon bat, Aldea ald, Ventana_principal v) {
        ArrayList<Integer> armas = ald.getArmas();
        double precio = bat.obtener_valor_armas(armas);
        if (precio < this.dinero_total) {
            ArrayList<Integer> v_armas = new ArrayList<Integer>();
            ArrayList<Integer> v_armaduras = new ArrayList<Integer>();
            for (int i = 0; i < armas.size(); i++) {
                if (armas.get(i) < 6) {
                    v_armas.add(armas.get(i));
                } else {
                    v_armaduras.add(armas.get(i));
                }
            }
            bat.recoger_arma(v_armas, v_armaduras, 1);
            ald.getArmas().clear();
            v.imprime("Se han comprado las armas");
        } else {
            v.imprime("No dispones de suficiente dinero");
        }
    }

    public int buscaBat(int x, int y) {

        Batallon bat;

        for (int i = 0; i < getCant_batallones(); i++) {

            bat = getBatallones().get(i);

            if (bat.getX() == x && bat.getY() == y && !bat.isMuerto()) {
                return i;
            }


        }
        return -1;

    }

    public void dividir_batallon_ventana(Mapa mapa, Batallon bat, Ventana_principal ventana) {
        Scanner sc;
        String nombre_bat;
        int posi_bat, cant_pers, cont, x = 0, y = 0;
        boolean haypersonaje = false;
        Personaje personajes[];
        sc = new Scanner(System.in);

        x = bat.getX() - 1;
        y = bat.getY() + 1;
        if (mapa.esValido(x, y) == false) {
            ventana.muestramensaje("No se puede realizar la accion, muevase a otro lado");
            return;
        }
//ya tenemos una posicion valida
        int cantxtipo[] = new int[Personaje.num_distintos];
        int hpxtipo[] = new int[Personaje.num_distintos];

//        this.batallones[posi_bat].getpersonajesxtipo(cantxtipo, hpxtipo);
        bat.getpersonajesxtipo(cantxtipo, hpxtipo);
        personajes = new Personaje[30];

        Batallon batN = new Batallon("Batallon" + this.cant_batallones, this.tipo_ejercito, personajes, x, y, 0, mapa);

        for (int i = 0; i < Personaje.num_distintos; i++) {

            cant_pers = 1000; //valor muy grande para que entre al loop
            if (cantxtipo[i] > 0) {
                boolean muestro = true;


                while (cant_pers > cantxtipo[i]) {
                    String mensajeamostrar = "Cantidad de " + Personaje.tipos[i] + " a agregar a nuevo batalon";
                    String numobtenido;
                    numobtenido = ventana.obtenvalor(mensajeamostrar);
                    if (numobtenido == null) {
                        batN.setMuerto(true, mapa);
                        return;
                    }
                    try {
                        cant_pers = Integer.parseInt(numobtenido);
                    } catch (Exception ex) {
                        ventana.muestramensaje("Por favor ingrese un numero");
                        muestro = false;
                    }
                    if (cant_pers > cantxtipo[i]) {
                        if (muestro) {
                            ventana.muestramensaje("No tiene suficientes elementos de este tipo");
                        }
                        muestro = true;
                    }
                }
                if (cant_pers > 0) {
                    haypersonaje = (haypersonaje || true);
                }
            }
            for (int j = 0; j < bat.getNumPersonajes() && cant_pers > 0; j++) {
                if (bat.personajes[j].tipo == i) {
                    //                    batN.agregarPersonaje(this.batallones[posi_bat].sacarPersonaje(j));
                    batN.agregarPersonaje(bat.sacarPersonaje(j));
                    cant_pers--;
                    if (cant_pers == 0) {
                        break;
                    }

                }
            }
        }
//si se quedo con 0 soldados el dinero pasa al nuevo batallon
        if (!haypersonaje) {
            batN.setMuerto(true, mapa);
        }
        if (haypersonaje) {
            batN.setSprite(mapa);
            bat.setSprite(mapa);
            this.agregar_batallon(batN);
        }
        //ventana.update(ventana.getGraphics());
        ventana.dibuja();

    }
}
